package mc.dao;


import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import mc.domain.Pacjent;
import mc.domain.Swiadczenie;
import mc.util.DateConvert;
import mc.util.McDate;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Expression;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class SwiadczenieManagerDAOHb extends HibernateDaoSupport implements ISwiadczenieManagerDAO {

	public void deleteSwiadczenie(Swiadczenie s) {
			getHibernateTemplate().delete(s);

	}

	public Swiadczenie getSwiadczenieById(int id) {
			return (Swiadczenie) getHibernateTemplate().get(Swiadczenie.class, new Integer(id));
				
	}
	
	public void saveSwiadczenie(Swiadczenie s) {
		getHibernateTemplate().saveOrUpdate(s);

	}


	public List getSwiadczeniaByDate(String dzien, boolean czyRefundowane) {
		
		McDate dat=DateConvert.getRangeForOneDay(dzien);
//		return getHibernateTemplate().find("from Swiadczenie s").add(Expression.eq("refundacja", czyRefundowane));
		return getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Swiadczenie.class).
//		add(Expression.eq("data", dat.getFrom())).
		add(Expression.eq("refundacja", czyRefundowane)));
	}
	
	
	public List getSwiadczeniaByPacjent(int id) {
		return getHibernateTemplate().find("from Swiadczenie s where s.pacjent.id = ?",id);
	}

	public List getSwiadczeniaByPacjent(Pacjent p) {
			return getHibernateTemplate().find("from Swiadczenie s where s.pacjent = ?", p);
	}

	public List getSwiadczeniaByDates(String odDzien, String dzienDo, boolean czyRefundowane) {
		
//		SessionFactory sessionFactory = getSessionFactory();
//		Session session = SessionFactoryUtils.
//        getSession(sessionFactory, true);
//		TransactionSynchronizationManager.
//        bindResource(sessionFactory, 
//                new SessionHolder(session));
//
//
		McDate dat=DateConvert.getRangeForInterval(odDzien, dzienDo);
//		List<Swiadczenie> listaSwiadczen = getHibernateTemplate().find("from Swiadczenie s");
//		
//	    TransactionSynchronizationManager.
//        unbindResource(sessionFactory);
//	    SessionFactoryUtils.
//        releaseSession(session, sessionFactory);
//		return listaSwiadczen;


		return getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Swiadczenie.class).
//		add(Expression.between("data", dat.getFrom(), dat.getTo())).
		add(Expression.eq("refundacja", czyRefundowane)));
	}
	
	public Date getAktualnyCzasZBazy() {
		return (Date) getHibernateTemplate().execute(new HibernateCallback(){

			public Object doInHibernate(Session session) throws HibernateException, SQLException {
				
				StringBuffer sql = new StringBuffer("select now() as result");
				Query query = session.createSQLQuery(sql.toString()).addScalar("result",Hibernate.TIMESTAMP);
				return query.uniqueResult();
			}
		});
	}


	

}
